package block

import (
	"BlockChainProject/tools"
	"bytes"
	"strconv"
	"time"
)

/**
 * @author: 清秋
 * @email: 15770670622
 * @datetime: 10:28 2022/3/16
 * @Description:
 */
type Block struct {
	TimeStamp  int64  //时间戳
	PrevHsah []byte  //上一个区块的hash值
	Data  []byte  //交易信息
	Hash  []byte  //当前区块的hash值
}

/**
创建区块
*/
func CreateBlock(data []byte,prevHash []byte)*Block{
	//实例化一个结构体
	block:=Block{
		TimeStamp: time.Now().Unix(),
		PrevHsah: prevHash,
		Data: data,
	}
	block.Hash = block.GetHash()
	return &block
}

/**
计算当前区块的hash值

函数  是任何人都可以调用的
方法  需要有接收者，只能固定的对象来调用这个方法
当前区块的hash值的计算方法： 由时间戳 + 上一个区块的hash值 +交易信息 拼接到一起 形成一个字符串
计算这个字符串的hash
*/

func (block *Block) GetHash()[]byte{
	//怎么把int类型转出[]byte类型
	// int 转成 字符串
	time:=[]byte(strconv.FormatInt(block.TimeStamp,10))
	//如何拼接   bytes.Join  第一个参数，存放的是要拼接的内容 ，第二个参数 以什么方式进行拼接
	hash:=bytes.Join([][]byte{time,block.PrevHsah,block.Data},[]byte{})
	return tools.SetHash(hash)

}

/**
创建创世区块
*/
func GenesisBlock(data []byte)*Block{

	return CreateBlock(data,nil)
}